package study.tag;

import java.io.InputStream;
import java.util.Properties;

import org.apache.commons.io.IOUtils;
import org.springframework.util.Assert;

import com.barney.support.util.ClasspathResourceUtils;
import com.barney.support.web.WebSearch;

/**
 * URL 태그
 * <p>
 * 리소스 파일을 위한 태그를 위해서는 <tt>applicationContext.xml</tt> 파일에 다음과 같이 설정한다.
 * <br/>
 * <tt>&lt;mvc:resources mapping="/resources-#{T(study.tag.UrlTag).VERSION}/**" location="/WEB-INF/resources/"/&gt;</tt>
 * </p>
 * 참고: {@link http://static.springsource.org/spring/docs/current/spring-framework-reference/html/mvc.html#mvc-static-resources}
 *
 * @author Barney Kim
 */
public class UrlTag {

	/**
	 * 버전은 실행 일시로 <tt>MMddHHmmss</tt> 형식이다.
	 */
	public static final String VERSION = "1";

	public static final String RESOURCE_PREFIX = "/resources";

	private static final String APPLICATION_PROPERTY_PATH = "application.properties";

	private static final Properties APPLICATION_PROPERTIES = new Properties();

	static {
		loadProperties(APPLICATION_PROPERTIES, APPLICATION_PROPERTY_PATH);
	}

	private static void loadProperties(Properties properties, String resourcePath) {
		InputStream istream = null;
		try {
			istream = ClasspathResourceUtils.getResourceAsStream(resourcePath);
			properties.load(istream);
		} catch (Exception ex) {
			throw new RuntimeException(ex.getMessage(), ex);
		} finally {
			IOUtils.closeQuietly(istream);
		}
	}

	/**
	 * @return 버전을 반환한다.
	 */
	public static String getVersion() {
		return VERSION;
	}

	/**
	 * JavaScript URL을 반환한다.
	 *
	 * @param url
	 */
	public static String jsUrl(String url) {
		return resourceUrl(url);
	}

	/**
	 * JavaScript 라이브러리 URL을 반환한다.
	 *
	 * @param url
	 */
	public static String jsLibUrl(String url) {
		return resourceUrl(url);
	}

	/**
	 * CSS URL을 반환한다.
	 *
	 * @param url
	 */
	public static String cssUrl(String url) {
		return resourceUrl(url);
	}

	/**
	 * 이미지 URL을 반환한다.
	 *
	 * @param url
	 */
	public static String imgUrl(String url) {
		return resourceUrl(url);
	}

	/**
	 * resource URL을 반환한다.
	 *
	 * @param url
	 */
	public static String resourceUrl(String url) {
		Assert.hasText(url, "url을 지정해야 합니다.");
		return String.format("%s-%s%s", RESOURCE_PREFIX, VERSION, url);
	}

	/**
	 * resource URL을 반환한다.
	 *
	 * @param url
	 */
	public static String resourceUrlPostfix(final String url) {
		Assert.hasText(url, "url을 지정해야 합니다.");
		String s = url;
		if(s.indexOf("?") > 0) {
			s += "&amp;v=";
		} else {
			s += "?v=";
		}
		return String.format("%s%s%s", RESOURCE_PREFIX, s, VERSION);
	}

	/**
	 * 검색을 위한 URL을 반환한다.
	 *
	 * @param search
	 */
	public static String urlForSearch(WebSearch search) {
		return search.toUrl();
	}

	/**
	 * 검색을 위한 URL을 반환한다.
	 *
	 * @param search
	 */
	public static String urlWithSearch(String prefixURI, WebSearch search) {
		return search.toUrl(prefixURI);
	}
}
